From f49717baeabf71c2e93ad7bac0c5989a6cf37354 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 13 Nov 2008 14:19:56 +0000 Subject: [PATCH] x86, hvm: Provide access to limited VCPUOP_ hypercalls. Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/hvm.c | 41 +++++++++++++++++++++++++++++++++++++ xen/include/xen/hypercall.h | 6 ++++++ 2 files changed, 47 insertions(+) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index b87f953af1..261fc7e4d3 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1884,6 +1884,25 @@ static long hvm_memory_op(int cmd, XEN_GUEST_HANDLE(void) arg) return rc; } +static long hvm_vcpu_op( + int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) +{ + long rc; + + switch ( cmd ) + { + case VCPUOP_register_runstate_memory_area: + case VCPUOP_get_runstate_info: + rc = do_vcpu_op(cmd, vcpuid, arg); + break; + default: + rc = -ENOSYS; + break; + } + + return rc; +} + typedef unsigned long hvm_hypercall_t( unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); @@ -1895,6 +1914,7 @@ typedef unsigned long hvm_hypercall_t( static hvm_hypercall_t *hvm_hypercall32_table[NR_hypercalls] = { [ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)hvm_memory_op, [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op, + [ __HYPERVISOR_vcpu_op ] = (hvm_hypercall_t *)hvm_vcpu_op, HYPERCALL(xen_version), HYPERCALL(event_channel_op), HYPERCALL(sched_op), @@ -1911,9 +1931,29 @@ static long hvm_memory_op_compat32(int cmd, XEN_GUEST_HANDLE(void) arg) return rc; } +static long hvm_vcpu_op_compat32( + int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg) +{ + long rc; + + switch ( cmd ) + { + case VCPUOP_register_runstate_memory_area: + case VCPUOP_get_runstate_info: + rc = compat_vcpu_op(cmd, vcpuid, arg); + break; + default: + rc = -ENOSYS; + break; + } + + return rc; +} + static hvm_hypercall_t *hvm_hypercall64_table[NR_hypercalls] = { [ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)hvm_memory_op, [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op, + [ __HYPERVISOR_vcpu_op ] = (hvm_hypercall_t *)hvm_vcpu_op, HYPERCALL(xen_version), HYPERCALL(event_channel_op), HYPERCALL(sched_op), @@ -1923,6 +1963,7 @@ static hvm_hypercall_t *hvm_hypercall64_table[NR_hypercalls] = { static hvm_hypercall_t *hvm_hypercall32_table[NR_hypercalls] = { [ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)hvm_memory_op_compat32, [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op, + [ __HYPERVISOR_vcpu_op ] = (hvm_hypercall_t *)hvm_vcpu_op_compat32, HYPERCALL(xen_version), HYPERCALL(event_channel_op), HYPERCALL(sched_op), diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h index 7d58109ec2..3997b2f96a 100644 --- a/xen/include/xen/hypercall.h +++ b/xen/include/xen/hypercall.h @@ -124,6 +124,12 @@ compat_memory_op( unsigned int cmd, XEN_GUEST_HANDLE(void) arg); +extern int +compat_vcpu_op( + int cmd, + int vcpuid, + XEN_GUEST_HANDLE(void) arg); + #endif #endif /* __XEN_HYPERCALL_H__ */ -- 2.30.2